﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace Projeto
{
    
    public class Baralho 
    {
        
        /// <summary>
        ///  Constante com o máximo de cartas 
        /// </summary>
        public  static int QTD_MAX_CARTAS = 4;
        
        public static Random aleatorio = new Random();

        /// <summary>
        /// Cartas do baralho armazenadas em uma lista
        /// </summary>
        public List<Carta> Cartas;
        
        public List<Carta> cartas
        {
            get { return Cartas; }
            set
            {
                //TODO verificar uma maneira melhor de inicializar as cartas
                Cartas = value;
            }
        }
        
        /// <summary>
        /// Lista com as imagens que serão utilizadas nas cartas
        /// </summary>
        private List<Texture2D> imagens;

        /// <summary>
        ///  Construtor da Classe
        ///  Monta o Baralho a partir das imagens disponibilizadas no ProjetoContent
        /// </summary>
        /// <param name="Content"> Referencia ao ProjetoContent</param>
        public Baralho(ContentManager Content, GameWindow janelaJogo)
        {
            // objeto com as cartas
            cartas = new List<Carta>();

            // objeto com uma lista de imagens carregadas a partir do conteudo disponibilizado
            imagens = carregaImagens(Content);

            // crio uma unica variavel para que apenas um objeto fique em memória e seja reaproveitado
            Carta carta = null;
            for (int i = 0; i < QTD_MAX_CARTAS; i++)
            {
                // inicializo a carta
                carta = new Carta();

                // Escolho uma imagem para carta a partir da lista de imagens e armazeno a posição dessa imagem na lista
                int indice = aleatorio.Next(0, imagens.Count -1);
                carta.imagem = imagens[indice];
                
                // removo a posição da imagem escolhida para que não seja apresentada novamente
                imagens.RemoveAt(indice);
                carta.pontos = aleatorio.Next(1,10);

                // a carta inicialmente não fica visível até que sofra um evento (clique ou toque na tela) que deixará a carta visível
                carta.visivel = false;


                //TODO VERIFICAR a localizacao desse tratamento abaixo

                carta.tamanho = new Vector2(
                carta.imagem.Width, // isso quer dizer que ele pega os vetores da textura sem precisar fazer na mão? sim
                carta.imagem.Height);
                carta.posicao = new Vector2(
                    aleatorio.Next((int)(janelaJogo.ClientBounds.Width - carta.tamanho.X)),
                    aleatorio.Next((int)(janelaJogo.ClientBounds.Height - carta.tamanho.Y))); // isso é pra ver se não tá passando do tamanho da janela ? sim
                carta.destino = new Rectangle(
                    (int)carta.posicao.X,
                    (int)carta.posicao.Y, // diferença entre destino e posição , nenhuma
                    (int)carta.tamanho.X,
                    (int)carta.tamanho.Y);

                carta.origem = new Rectangle( // isso aqui é pra dizer que a imagem começa da posição 0, e não um "tile"
                    0,
                    0,
                    (int)carta.tamanho.X,
                    (int)carta.tamanho.Y);
                

                //this.visivel = false;//atrapalha novo get set

                carta.tempoParaAparecer = aleatorio.Next(60, 120);
                carta.proximoAparecer = carta.tempoParaAparecer;

                carta.janelaJogo = janelaJogo;

                carta.qtdMaxima = QTD_MAX_CARTAS;
                carta.qtdAgora++;

                carta.fonte = Content.Load<SpriteFont>("Fonts/gameFont");
                //TODO Verificar a localizacao do tratamento acima

                // Adiciono a carta na lista de cartas
                cartas.Add(carta);
            }
        }

        /// <summary>
        /// Metodo que carrega as imagens
        /// </summary>
        /// <param name="Content">Referencia ao repositorio de imagens que se encontra no ProjetoContent</param>
        /// <returns>Lista de imagens</returns>
        private List<Texture2D> carregaImagens(ContentManager Content)
        {
            imagens = new List<Texture2D>();
            
            imagens.Add(Content.Load<Texture2D>("Cartas/carta_bonde"));
            imagens.Add(Content.Load<Texture2D>("Cartas/carta_bondinho"));
            imagens.Add(Content.Load<Texture2D>("Cartas/carta_carro"));
            imagens.Add(Content.Load<Texture2D>("Cartas/carta_estadio_1"));
            imagens.Add(Content.Load<Texture2D>("Cartas/carta_estadio_2"));
            imagens.Add(Content.Load<Texture2D>("Cartas/carta_favela"));
            imagens.Add(Content.Load<Texture2D>("Cartas/carta_floresta"));
            imagens.Add(Content.Load<Texture2D>("Cartas/carta_igreja"));
            imagens.Add(Content.Load<Texture2D>("Cartas/carta_lixeira"));
            imagens.Add(Content.Load<Texture2D>("Cartas/carta_mendigo"));
            imagens.Add(Content.Load<Texture2D>("Cartas/carta_predio"));

            return imagens;
            
        }

        public void Draw(SpriteBatch spriteBatch)
        {
            foreach (Carta carta in cartas)
            {
                carta.Draw(spriteBatch);
            }            
        }



    }
}
